#ifndef UnstructMG_AGGREGATE_COUPLED_PAIRWISE_HPP
#define UnstructMG_AGGREGATE_COUPLED_PAIRWISE_HPP

#include "par_CSRMatrix.hpp"

template<typename idx_t, typename setup_t, int dof>
idx_t* coupled_pairwise(const par_CSRMatrix<idx_t, setup_t, setup_t, dof> * par_fine_mat,
    par_CSRMatrix<idx_t, setup_t, setup_t, 1> * & R_mat, par_CSRMatrix<idx_t, setup_t, setup_t, 1> * & P_mat, const setup_t theta);
extern template int* coupled_pairwise(const par_CSRMatrix_I32F64F64_DOF1 *, par_CSRMatrix_I32F64F64_DOF1 * &, par_CSRMatrix_I32F64F64_DOF1 * &, const double);
extern template int* coupled_pairwise(const par_CSRMatrix_I32F64F64_DOF2 *, par_CSRMatrix_I32F64F64_DOF1 * &, par_CSRMatrix_I32F64F64_DOF1 * &, const double);
extern template int* coupled_pairwise(const par_CSRMatrix_I32F64F64_DOF3 *, par_CSRMatrix_I32F64F64_DOF1 * &, par_CSRMatrix_I32F64F64_DOF1 * &, const double);
extern template int* coupled_pairwise(const par_CSRMatrix_I32F64F64_DOF4 *, par_CSRMatrix_I32F64F64_DOF1 * &, par_CSRMatrix_I32F64F64_DOF1 * &, const double);

extern template int* coupled_pairwise(const par_CSRMatrix_I32F32F32_DOF1 *, par_CSRMatrix_I32F32F32_DOF1 * &, par_CSRMatrix_I32F32F32_DOF1 * &, const float );
extern template int* coupled_pairwise(const par_CSRMatrix_I32F32F32_DOF2 *, par_CSRMatrix_I32F32F32_DOF1 * &, par_CSRMatrix_I32F32F32_DOF1 * &, const float );
extern template int* coupled_pairwise(const par_CSRMatrix_I32F32F32_DOF3 *, par_CSRMatrix_I32F32F32_DOF1 * &, par_CSRMatrix_I32F32F32_DOF1 * &, const float );
extern template int* coupled_pairwise(const par_CSRMatrix_I32F32F32_DOF4 *, par_CSRMatrix_I32F32F32_DOF1 * &, par_CSRMatrix_I32F32F32_DOF1 * &, const float );

#endif